// API 基础地址
// 真机调试使用局域网IP，模拟器可以使用localhost
const BASE_URL = 'http://192.168.10.198:3000/api'; // 开发环境，生产环境改为实际服务器地址

/**
 * 封装请求方法
 * 支持两种调用方式：
 * 1. request({ url, method, data, params, header })
 * 2. request(url, method, data, header)
 */
export function request(urlOrConfig, method = 'GET', data = {}, header = {}) {
  return new Promise((resolve, reject) => {
    // 判断是对象参数还是独立参数
    let url, requestMethod, requestData, requestParams, requestHeader;
    
    if (typeof urlOrConfig === 'object') {
      // 对象参数方式
      url = urlOrConfig.url;
      requestMethod = urlOrConfig.method || 'GET';
      requestData = urlOrConfig.data || {};
      requestParams = urlOrConfig.params || {};
      requestHeader = urlOrConfig.header || {};
    } else {
      // 独立参数方式
      url = urlOrConfig;
      requestMethod = method;
      requestData = data;
      requestParams = {};
      requestHeader = header;
    }

    // 获取用户信息
    const userId = uni.getStorageSync('userId') || '';
    const userName = uni.getStorageSync('userName') || '';

    // 处理 GET 请求的 params
    let fullUrl = url.startsWith('http') ? url : BASE_URL + url;
    if (requestMethod.toUpperCase() === 'GET' && Object.keys(requestParams).length > 0) {
      const queryString = Object.keys(requestParams)
        .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(requestParams[key])}`)
        .join('&');
      fullUrl = fullUrl + (fullUrl.includes('?') ? '&' : '?') + queryString;
    }

    // 请求参数
    const requestOptions = {
      url: fullUrl,
      method: requestMethod.toUpperCase(),
      header: {
        'Content-Type': 'application/json',
        'user-id': userId,
        // 对用户名进行 Base64 编码，避免中文字符导致请求头错误
        'user-name': userName ? encodeURIComponent(userName) : '',
        ...requestHeader
      },
      timeout: 10000,
      success: (res) => {
        if (res.statusCode === 200) {
          const result = res.data;

          // 根据后端返回的格式判断
          if (result.code === 200) {
            resolve(result);
          } else {
            // 只抛出错误，不自动显示toast，让调用方决定如何处理
            reject(new Error(result.msg || '请求失败'));
          }
        } else {
          // HTTP错误也只抛出，不自动显示toast
          reject(new Error(`请求失败 (HTTP ${res.statusCode})`));
        }
      },
      fail: (err) => {
        console.error('请求失败:', err);
        const errorMsg = err.errMsg || '网络连接失败';
        reject(new Error(errorMsg));
        
        // 网络连接失败时自动提示（这种情况通常需要用户注意）
        uni.showToast({
          title: '网络连接失败，请检查网络',
          icon: 'none',
          duration: 2000
        });
      }
    };

    // GET 请求不需要 body，其他请求使用 body
    if (requestMethod.toUpperCase() !== 'GET') {
      requestOptions.data = requestData;
    }

    // 发起请求
    uni.request(requestOptions);
  });
}

/**
 * GET 请求
 */
export function get(url, params = {}, header = {}) {
  // 将参数拼接到URL
  if (Object.keys(params).length > 0) {
    const queryString = Object.keys(params)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
      .join('&');
    url = url + (url.includes('?') ? '&' : '?') + queryString;
  }
  
  return request(url, 'GET', {}, header);
}

/**
 * POST 请求
 */
export function post(url, data = {}, header = {}) {
  return request(url, 'POST', data, header);
}

// 默认导出 request 函数
export default request;
